package com.lzh.hash;

/**
 * @author lzh
 * @create 2022-08-07 17:08
 * <p>
 * StudentLinkedList为链表
 */
public class StudentLinkedList {

    private Student head;// 头指针

    /**
     * 添加元素,没有按顺序添加，也可以添加重复的元素
     *
     * @param student 要添加的节点
     */
    public void add(Student student) {
        // 如果链表的头结点为null，就将将要添加的student节点添加到头节点
        if (head == null) {
            head = student;
            return;
        }
        Student currentStu = head; // 辅助指针，用来遍历链表
        while (true) {
            if (currentStu.getNext() == null) { // 如果遍历的节点的下一个节点为null
                currentStu.setNext(student); // 添加到currentStu的下一个节点
                break;
            }
            currentStu = currentStu.getNext(); // 如果当前的节点的下一个节点不为null， 则移动辅助指针
        }
    }

    /**
     * 按id顺序添加元素
     *
     * @param student
     */
    public void addByOrder(Student student) {
        // 如果链表的头结点为null，就将将要添加的student节点添加到头节点
        if (head == null) {
            head = student;
            return;
        }
        Student currentStu = head; // 辅助指针，用来遍历链表
        while (true) {
            // 如果插入的元素大于当前遍历到的元素
                if (student.getId() > currentStu.getId()) {
                    if (currentStu.getNext() != null) {
                        if (currentStu.getNext().getId() > student.getId()) {
                            student.setNext(currentStu.getNext());
                            currentStu.setNext(student);
                            break;
                        }
                    } else {
                        currentStu.setNext(student);
                        break;
                    }
                } else if (student.getId() == currentStu.getId()) {
                    // 更新
                    currentStu.setName(student.getName());
                    break;
                } else {
                    // 头节点比插入的节点大
                    student.setNext(head);
                    head = student;
                    break;
                }
            currentStu = currentStu.getNext(); // 如果当前的节点的下一个节点不为null， 则移动辅助指针
        }
    }

    /**
     * 通过student 的 id 进行删除
     *
     * @param id
     * @param i  第几条链表
     */
    public void del(int id, int i) {
        // 如果链表为空
        if (head == null) {
            System.out.println("第" + i + "链表为空，无法删除");
            return;
        }

        // 考虑如果删除的是头节点
        if (head.getId() == id) {
            head = head.getNext();
            return;
        }
        // 如果删除的不是头节点
        Student currentStu = head;
        Student currentStuNext = currentStu.getNext();// 指向currentStu的下一个节点
        while (true) {
            // 此条链表中如果存在此id
            if (currentStuNext.getId() == id) {
                currentStu.setNext(currentStuNext.getNext());
                break;
            }
            // 如果currentStuNext为null，则表明已经遍历完此链表了，没有找到此id的节点
            if (currentStuNext.getNext() == null) {
                System.out.println("没有此id的学生，删除无效");
                break;
            }
            currentStu = currentStu.getNext();
            currentStuNext = currentStuNext.getNext();
        }
    }

    /**
     * 更新节点的信息
     */
    public void update(int id, String name, int i) {
        if (head == null) {
            System.out.println("第" + i + "链表为空，更改失败");
            return;
        }

        Student currentStu = head;
        while (true) {
            // 找到id
            if (currentStu.getId() == id) {
                // 更改此id学生的姓名
                currentStu.setName(name);
                break;
            }
            if (currentStu.getNext() == null) {
                System.out.println("没有此id学生，更改无效");
                break;
            }
            currentStu = currentStu.getNext();
        }

    }

    /**
     * 用来显示链表的所有节点
     *
     * @param i 传入遍历时的i的值
     */
    public void list(int i) {
        if (head == null) {
            System.out.println("第" + (i + 1) + "链表为空");
            return;
        }
        System.out.printf("第%d条链表", (i + 1));
        Student currentStu = head; // 辅助指针，用来遍历链表
        while (true) {
            System.out.printf("=> id=%d name=%s\t", currentStu.getId(), currentStu.getName());
            if (currentStu.getNext() == null) {
                break;
            }
            currentStu = currentStu.getNext();
        }
        System.out.println();
    }
}
